﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define DEBUG 0

//int main()
//{
//	FILE *pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	
//	int ret = fputs("hello world\n",pf);
//	printf("%d\n", ret);
// 
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
//fopen fclose fputc fgetc fputs fgets


//int main()
//{
//	//fwrite
//	FILE* pf = fopen("test.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 0;
//	}
//	//
//	/*int arr[10] = { 1,2,3,4,5 };
//	fwrite(arr,sizeof(int),5,pf);*/
//	int arr[10] = { 0 };
//	size_t n = 0;
//	int i = 0;
//	while (n = fread(arr[i], sizeof(int), 1, pf))
//	{
//		printf("%d ", arr[i]);
//		i++;
//	}
//	//
//	fclose(pf);
//	pf == NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("test.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fprintf(pf,"%s","abcdef");
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//typedef struct R
//{
//	char name[20];
//	int age;
//	float score;
//}ret;
//int main()
//{
//	//fscanf从指定的流收取数据；
//	ret code;
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fscanf(pf, "%s %d %f", code.name, &(code.age) ,& (code.score));
//	fprintf(stdout, "%s %d %f", code.name, code.age, code.score);
//	return 0;
//}

//int main()
//{
//	char arr[20] = "hello world";
//	size_t ret = sizeof(arr) / sizeof(arr[0]);
//	fwrite(arr, sizeof(arr[0]), ret, stdout);
//	return 0;
//}

//int main()
//{
//	//fwrite(以二进制写入到文件"test.txt中")
//	int a = 10000; 
//	FILE* pf = fopen("test.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	fwrite(arr, sizeof(arr[0]), sz-1, pf);
//	fprintf(stdout,"%s\n", arr);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//(fwrite以二进制写入文件).
//	int a = 10000;
//	FILE * pf =  fopen("test.txt", "wb");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	fwrite(&a, 4, 1, pf);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//fwrite(写道屏幕终端)
//	char arr[] = "hello world!";
//	size_t sz = sizeof(arr) / sizeof(arr[0]);
//	fwrite(arr,sizeof(arr[0]),sz,)
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("test.txt", "rb");
//	if (pf = NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int a = 0;
//	fread(&a,sizeof(int),1,pf);
//	fprintf(stdout, "%d", a);
//	return 0;
//}

//int main()
//{
//	FILE * pf1 = fopen("test1.txt", "r");
//	if (pf1 == NULL)
//	{
//		perror("fopen:pf1");
//		return 1;
//	}
//	FILE* pf2 = fopen("test2.txt", "w");
//	if (pf2 == NULL)
//	{
//		perror("fopen:pf2");
//		return 1;
//	}
//	char ch;
//	while ((ch = fgetc(pf1)) != EOF)
//	{
//		fputc(ch, pf2);
//	}
//	fclose(pf1);
//	pf1 = NULL;
//	fclose(pf2);
//	pf2 = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("test.txt", "rb");
//	if (pf == NULL)
//	{
//		perror("fopen:pf");
//		return 1;
//	}
//	int a;
//	fread(&a, sizeof(int), 1, pf);
//	fprintf(stdout, "%d", a);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen:pf");
//		return 1;
//	}
//
//	fseek(pf, 5, SEEK_SET);//偏离5位现在
//	long int offset = ftell(pf);
//	fprintf(stdout, "%d\n", offset);
//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//测试feof和ferror
//	FILE* pf = fopen("test.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen:pf");
//		return 1;
//	}
//	char ch;
//	fseek(pf, 0, SEEK_SET);
//	while ((ch=fgetc(pf)) != EOF)
//	{
//		fprintf(stdout, "%c\n",ch);
//	}
//	//
//	if (feof(pf))
//	{
//		fprintf(stdout, "success");
//	}
//	if (ferror(pf))
//	{
//		fprintf(stdout, "fail");
//	}
//	//
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	char a[10] = { 'a','b','c','d' };
//	fwrite(a, 1, 3, stdout);
//	return 0;
//}

#if DEBUG
int main()
{
	FILE* pf = fopen("test.txt", "r");
	char ch;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c\n",ch);//这里fgetc被又调用一次；
	}
	return 0;
}
#endif

#if DEBUG
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen:pf");
		return 1;
	}
	//
	fprintf(stdout, "%c ", fgetc(pf));//a
	rewind(pf);//将光标调回。
	fprintf(stdout, "%c ", fgetc(pf));//a
	//
	fclose(pf);
	pf = NULL;
	return 0;
}
#endif

#if DEBUG
int main()
{
	fprintf(stdout,"%c", 'a');
	rewind(stdout);//rewind(stdout) != '\b'
	fprintf(stdout,"%c", 'a');
	return 0;
}
#endif

#if DEBUG
int main()
{
	fprintf(stdout, "%s\n%s\n%s", __FILE__,__DATE__,__TIME__);//预定义符号
	return 0;
}
#endif

#ifdef Max
#define Max 1;
#endif
//判断是否被定义时(条件编译)
//1
#if DEBUG
#define Max 100;
int main()
{
#if !defined(Max)
	printf("yes\n");
#elif defined(min)
	;
#endif
	return 0;
}
#endif
#pragma once

#if DEBUG
//宏(取消定义)
#define Max 1
int main()
{
	fprintf(stdout, "%d\n",Max);
#undef Max
	fprintf(stdout, "%d\n", Max);
	return 0;
}
#endif

#if DEBUG
//宏(#和##)
#define PRINTF(N) \
printf("the value of "#N" is %d",N);
int main()
{
	int b = 0;
	PRINTF(b);
	return 0;
}
#endif

//许多C的编译器提供了⼀种能⼒，允许在命令⾏中定义符号。⽤于启动编译过程。
//例如：当我们根据同⼀个源⽂件要编译出⼀个程序的不同版本的时候，这个特性有点⽤处。
//不同版本的函数
#define PRINTF(type) 
int main()
{

	return 0;
}